/**
 * 
 */

package com.gustozzi.distribucion.negocio.impl;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.List;

import com.gustozzi.distribucion.action.util.Constantes;
import com.gustozzi.distribucion.dao.DistribucionDAO;
import com.gustozzi.distribucion.dao.impl.DistribucionDAOImpl;
import com.gustozzi.distribucion.dao.util.DataAccess;
import com.gustozzi.distribucion.dao.util.DataAccessExceptions;
import com.gustozzi.distribucion.negocio.DistribucionBO;
import com.gustozzi.domain.Despacho;
import com.gustozzi.domain.Devolucion;
import com.gustozzi.domain.GuiaRemision;
import com.gustozzi.domain.HojaRuta;
import com.gustozzi.domain.Pedido;
import com.gustozzi.domain.Reserva;
import com.gustozzi.domain.Usuario;

/**
 * @author FABRIZIO
 * 
 */
public class DistribucionBOImpl implements DistribucionBO
{
    SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
    DataAccess transaccion = new DataAccess("java:comp/env/jdbc/Gustozzi");
    DistribucionDAO seguridadDAO = new DistribucionDAOImpl(transaccion);

    DataAccess transaccionDistribucion = new DataAccess("java:comp/env/jdbc/Distribucion");
    DistribucionDAO distribucionDAO = new DistribucionDAOImpl(transaccionDistribucion);

    @Override
    public Usuario obtenerUsuario(String usuario, String password) throws DataAccessExceptions
    {
        Usuario beanUsuario = null;
        try
        {
            beanUsuario = seguridadDAO.obtenerUsuario(usuario, password);
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return beanUsuario;
    }

    @Override
    public List<Despacho> obtenerListaDespacho(String codigo, String codigoCentroDistribucion, String fechaDesde,
            String fechaHasta) throws DataAccessExceptions
    {
        List<Despacho> listaDespacho = null;
        int codigoDespacho = 0;
        int codigoCentro = 0;
        Date desde = null;
        Date hasta = null;

        try
        {
            if (!codigo.equalsIgnoreCase(""))
            {
                codigoDespacho = Integer.parseInt(codigo);
            }

            if (!fechaDesde.equalsIgnoreCase(""))
            {
                desde = new Date(sdf.parse(fechaDesde).getTime());
                hasta = new Date(sdf.parse(fechaHasta).getTime());
            }

            if (!codigoCentroDistribucion.equalsIgnoreCase(""))
            {
                codigoCentro = Integer.parseInt(codigoCentroDistribucion);
            }

            listaDespacho = distribucionDAO.obtenerListaDespacho(codigoDespacho, codigoCentro, desde, hasta);
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return listaDespacho;
    }

    @Override
    public List<Pedido> obtenerListaPedido(String codigo, String cliente, String fechaDesde, String fechaHasta)
            throws DataAccessExceptions
    {
        List<Pedido> listaPedido = null;
        int codigoPedido = -1;
        int codigoCliente = -1;
        Date desde = null;
        Date hasta = null;

        try
        {
            if (!codigo.equalsIgnoreCase(""))
            {
                codigoPedido = Integer.parseInt(codigo);
            }

            if (!fechaDesde.equalsIgnoreCase(""))
            {
                java.util.Date fechaUno = sdf.parse(fechaDesde);
                java.util.Date fechaDos = sdf.parse(fechaHasta);
                desde = new java.sql.Date(fechaUno.getTime());
                hasta = new java.sql.Date(fechaDos.getTime());
            }

            if (!cliente.equalsIgnoreCase(""))
            {
                codigoCliente = Integer.parseInt(cliente);
            }

            listaPedido = distribucionDAO.obtenerListaPedido(codigoPedido, codigoCliente, desde, hasta);
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return listaPedido;
    }

    @Override
    public String eliminarDespacho(String codigo) throws DataAccessExceptions
    {
        String respuesta;
        try
        {
            respuesta = distribucionDAO.eliminarDespacho(Integer.parseInt(codigo));
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return respuesta;
    }

    @Override
    public String reprogramarPedido(String codigo) throws DataAccessExceptions
    {
        String respuesta;
        try
        {
            respuesta = distribucionDAO.reprogramarPedido(Integer.parseInt(codigo));
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return respuesta;
    }

    @Override
    public String guardarDespacho(String codigoDespacho, String codigoCentro, String fechaEntrega,
            String codigoResponsable, List<Pedido> listaPedidos, boolean indicadorAccion) throws DataAccessExceptions
    {
        Date fecha = null;
        int responsable = 0;
        int centro = 0;
        String respuesta = Constantes.CADENA_VACIA;
        int listPedidos[] = null;
        Pedido beanPedido = null;
        int codDespacho = 0;
        try
        {
            fecha = new Date(sdf.parse(fechaEntrega).getTime());
            centro = Integer.parseInt(codigoCentro);
            responsable = Integer.parseInt(codigoResponsable);
            if (!codigoDespacho.equalsIgnoreCase(Constantes.CADENA_VACIA))
            {
                codDespacho = Integer.parseInt(codigoDespacho);
            }

            listPedidos = new int[listaPedidos.size()];

            for (int i = 0; i < listaPedidos.size(); i++)
            {
                beanPedido = (Pedido) listaPedidos.get(i);
                listPedidos[i] = Integer.parseInt(beanPedido.getCodigo());
            }

            respuesta = distribucionDAO.guardarDespacho(codDespacho, centro, fecha, responsable, listPedidos, indicadorAccion);
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions(e);
        }
        return respuesta;
    }

    @Override
    public String devolverPedido(String codigo) throws DataAccessExceptions
    {
        String uno = codigo;
        String respuesta = distribucionDAO.devolverPedido(codigo);
        return respuesta;
    }

    public List<Reserva> obtenerListaReserva(String codigo, String codigoCentroDistribucion, String fechaDesde,
            String fechaHasta) throws DataAccessExceptions
    {
        List<Reserva> listaReserva = null;
        int codigoReserva = 0;
        int codigoCentro = 0;
        Date desde = null;
        Date hasta = null;

        try
        {
            if (!codigo.equalsIgnoreCase(""))
            {
                codigoReserva = Integer.parseInt(codigo);
            }

            if (!fechaDesde.equalsIgnoreCase(""))
            {
                desde = new Date(sdf.parse(fechaDesde).getTime());
                hasta = new Date(sdf.parse(fechaHasta).getTime());
            }

            if (!codigoCentroDistribucion.equalsIgnoreCase(""))
            {
                codigoCentro = Integer.parseInt(codigoCentroDistribucion);
            }

            listaReserva = distribucionDAO.obtenerListaReserva(codigoReserva, codigoCentro, desde, hasta);
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return listaReserva;
    }

    @Override
    public List<HojaRuta> obtenerListaHojasRuta(String codigo, String codigoCentroDistribucion, String fechaDesde,
            String fechaHasta) throws DataAccessExceptions
    {
        List<HojaRuta> listaHojasRuta = null;
        int codigoHojaRuta = -1;
        int codigoCentro = -1;
        Date desde = null;
        Date hasta = null;

        try
        {
            if (!codigo.equalsIgnoreCase(""))
            {
                codigoHojaRuta = Integer.parseInt(codigo);
            }

            if (!fechaDesde.equalsIgnoreCase(""))
            {
                desde = new Date(sdf.parse(fechaDesde).getTime());
                hasta = new Date(sdf.parse(fechaHasta).getTime());
            }

            if (!codigoCentroDistribucion.equalsIgnoreCase(""))
            {
                codigoCentro = Integer.parseInt(codigoCentroDistribucion);
            }

            listaHojasRuta = distribucionDAO.obtenerListaHojasRuta(codigoHojaRuta, codigoCentro, desde, hasta);
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return listaHojasRuta;
    }

    @Override
    public List<GuiaRemision> obtenerListaGuiasRemision(String codigo, String fechaDesde, String fechaHasta)
            throws DataAccessExceptions
    {
        List<GuiaRemision> listaGuiasRemision = null;
        int codigoGuiaRemision = -1;
        Date desde = null;
        Date hasta = null;

        try
        {
            if (!codigo.equalsIgnoreCase(""))
            {
                codigoGuiaRemision = Integer.parseInt(codigo);
            }

            if (!fechaDesde.equalsIgnoreCase(""))
            {
                desde = new Date(sdf.parse(fechaDesde).getTime());
                hasta = new Date(sdf.parse(fechaHasta).getTime());
            }

            listaGuiasRemision = distribucionDAO.obtenerListaGuiasRemision(codigoGuiaRemision, desde, hasta);
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return listaGuiasRemision;
    }

    @Override
    public String guardarReserva(String codigoReserva, String codigoCentroDistribucion, String codigoTipoEstado,
            List<Pedido> listaPedidos, boolean indicadorRegistro) throws DataAccessExceptions
    {
        String respuesta = Constantes.CADENA_VACIA;
        int codReserva = 0;
        int codCentro = 0;
        int codEstado = 0;
        int listPedidos[] = null;
        Pedido beanPedido = null;
        try
        {
            if (!codigoReserva.equalsIgnoreCase(""))
            {
                codReserva = Integer.parseInt(codigoReserva);
            }
            codCentro = Integer.parseInt(codigoCentroDistribucion);

            if (codigoTipoEstado.equalsIgnoreCase("ACTIVO"))
            {
                codEstado = 1;
            }

            listPedidos = new int[listaPedidos.size()];

            for (int i = 0; i < listaPedidos.size(); i++)
            {
                beanPedido = (Pedido) listaPedidos.get(i);
                listPedidos[i] = Integer.parseInt(beanPedido.getCodigo());
            }

            respuesta = distribucionDAO
                    .guardarReserva(codReserva, codCentro, codEstado, listPedidos, indicadorRegistro);
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return respuesta;
    }

    @Override
    public List<Pedido> obtenerListaPedidoXReserva(String codigoReserva) throws DataAccessExceptions
    {
        List<Pedido> listaPedido = null;
        Date desde = null;
        Date hasta = null;
        int codigo = 0;

        try
        {
            codigo = Integer.parseInt(codigoReserva);

            listaPedido = distribucionDAO.obtenerListaPedidoXReserva(codigo);
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return listaPedido;
    }

    @Override
    public List<Devolucion> obtenerListaDevoluciones(String codigo, String codigoCentroDistribucion, String fechaDesde,
            String fechaHasta) throws DataAccessExceptions
    {
        List<Devolucion> listaDevolucion = null;
        int codigoDevolucion = 0;
        int codigoCentro = 0;
        Date desde = null;
        Date hasta = null;
        try
        {
            if (!codigo.equalsIgnoreCase(Constantes.CADENA_VACIA))
            {
                codigoDevolucion = Integer.parseInt(codigo);
            }

            if (!fechaDesde.equalsIgnoreCase(Constantes.CADENA_VACIA))
            {
                desde = new Date(sdf.parse(fechaDesde).getTime());
                hasta = new Date(sdf.parse(fechaHasta).getTime());
            }

            if (!codigoCentroDistribucion.equalsIgnoreCase(Constantes.CADENA_VACIA))
            {
                codigoCentro = Integer.parseInt(codigoCentroDistribucion);
            }

            listaDevolucion = distribucionDAO.obtenerListaDevoluciones(codigoDevolucion, codigoCentro, desde, hasta);
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return listaDevolucion;
    }

    @Override
    public String eliminarDevolucion(String codigo) throws DataAccessExceptions
    {
        String respuesta;
        try
        {
            respuesta = distribucionDAO.eliminarDevolucion(Integer.parseInt(codigo));
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return respuesta;
    }

    @Override
    public List<Pedido> obtenerListaPedidoXDevolucion(String codigo) throws DataAccessExceptions
    {
        List<Pedido> listaPedido = null;
        int codigoDevolucion = 0;

        try
        {
            if (!codigo.equalsIgnoreCase(Constantes.CADENA_VACIA))
            {
                codigoDevolucion = Integer.parseInt(codigo);
            }

            listaPedido = distribucionDAO.obtenerListaPedidoXDevolucion(codigoDevolucion);
        }
        catch (Exception e)
        {
            throw new DataAccessExceptions();
        }
        return listaPedido;
    }
}